/******************************************************************************
 * Copyright (C) 2011 ShenZhen ComTop Information Technology Co.,Ltd
 * All Rights Reserved.
 * 本软件为深圳康拓普开发研制。未经本公司正式书面同意，其他任何个人、团体不得使用、
 * 复制、修改或发布本软件.
 *****************************************************************************/

package com.code.common.utils;

import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.log4j.Logger;


/**
 * 通用工具管理类
 * 
 * @author 陈大周
 * @since jdk1.5
 * @version 2011-4-18 陈大周 新建
 */
public final class CommonUtils {
    
    /**
     * 构造函数
     */
    private CommonUtils() {
        super();
    }
    
    /** log4j对象 */
    private final static Logger LOGGER = Logger.getLogger(CommonUtils.class);
    
    /**
     * 时间转字符串
     * 
     * @param time 时间类型
     * @return 字符串
     */
    public static String getTimestampToString(Timestamp time) {
        SimpleDateFormat objSimpleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return objSimpleDate.format(time);
    }
    
    /**
     * 时间转字符串当天的0时
     * 
     * @param time 时间
     * @return 字符
     */
    public static String getDateToStringMin(Date time) {
        SimpleDateFormat objSimpleDate = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
        return objSimpleDate.format(time);
    }
    
    /**
     * 时间转字符串当天的23时59份59秒
     * 
     * @param time 时间
     * @return 字符
     */
    public static String getDateToStringMax(Date time) {
        SimpleDateFormat objSimpleDate = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
        return objSimpleDate.format(time);
    }
    
    /**
     * 时间转字符串，可以指定样式的转换时间
     * 
     * @param time 时间
     * @param strPattern 格式
     * @return 字符
     */
    public static String getTimestampToString(Timestamp time, String strPattern) {
        SimpleDateFormat objSimpleDate = new SimpleDateFormat(strPattern);
        return objSimpleDate.format(time);
    }
    
    /**
     * 时间转字符串，可以指定样式的转换时间
     * 
     * @param time 时间
     * @return 字符
     */
    public static String timestampToString(Timestamp time) {
        SimpleDateFormat objSimpleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return objSimpleDate.format(time);
    }
    
    /**
     * 时间转字符串，可以指定样式
     * 
     * @param objDate 时间
     * @param strPattern 格式
     * @return 字符
     */
    public static String getDateToString(Date objDate, String strPattern) {
        SimpleDateFormat objSimpleDate = new SimpleDateFormat(strPattern);
        return objSimpleDate.format(objDate);
    }
    
    /**
     * 时间转字符串
     * 
     * @param objDate 时间
     * @return 字符
     */
    public static String getDateToString(Date objDate) {
        SimpleDateFormat objSimpleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return objSimpleDate.format(objDate);
    }
    
    /**
     * 字符串转时间
     * 
     * @param strTtime 字符
     * @return 时间格式
     */
    public static Date getStringToDate(String strTtime,String strPattern) {
        SimpleDateFormat objSimpleDate = new SimpleDateFormat(strPattern);
        Date objDate = null;
        try {
            objDate = objSimpleDate.parse(strTtime);
        } catch (ParseException e) {
            LOGGER.error("字符串转时间异" + e);
        }
        return objDate;
    }
    /**
     * 字符串转时间
     * 
     * @param strTtime 字符
     * @return 时间格式
     */
    public static Date getStringToDate(String strTtime) {
        SimpleDateFormat objSimpleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date objDate = null;
        try {
            objDate = objSimpleDate.parse(strTtime);
        } catch (ParseException e) {
            LOGGER.error("字符串转时间异" + e);
        }
        return objDate;
    }
    
    /**
     * 字符串转时间
     * 
     * @param strTtime 字符
     * @return 时间格式
     */
    public static Timestamp getStringToTimestamp(String strTtime) {
        SimpleDateFormat objSimpleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date objDate = null;
        try {
            objDate = objSimpleDate.parse(strTtime);
        } catch (ParseException e) {
            LOGGER.error("字符串转时间异" + e);
            return null;
        }
        return new Timestamp(objDate.getTime());
    }
    
    /**
     * 获取uuid
     * 
     * @return 唯一标识
     */
    public static String getUUID() {
        return UUID.randomUUID().toString();
    }
    
    /**
     * 返回当前时间
     * 
     * @return 当前时间
     */
    public static Timestamp getCurrentTime() {
        return new Timestamp(new Date().getTime());
    }
    
    /**
     * 处理double的精度
     * 
     * @param dParam
     * @param iScale
     * @return double
     */
    public static double getDoubleToPattern(double dParam, int iScale) {
        double dParamValue = 0.0D;
        try {
            BigDecimal objB = new BigDecimal(dParam);
            dParamValue = objB.setScale(iScale, BigDecimal.ROUND_HALF_UP).doubleValue();
        } catch (Exception e) {
            LOGGER.error("处理double精度异常", e);
            return dParam;
        }
        
        return dParamValue;
    }
    
    /**
     * 处理当前时间为yyyy-MM-dd HH:mm:s0的格式
     * 
     * @param objDate
     * @return Date
     */
    public static String getCurrentDate(Date objDate) {
        String strDate = CommonUtils.getDateToString(objDate, "yyyy-MM-dd HH:mm:ss");
        strDate = strDate.subSequence(0, 18) + "0";
        return strDate;
    }
    
    /**
     * 数据精度转换方法
     * 
     * @param dOringal 原始数值
     * @param iParam 被出的参数
     * @param iScale 保留的精度
     * @return double 计算结果
     */
    public static double transferData(double dOringal, double iParam, int iScale) {
        dOringal = dOringal / iParam;
        // 保留指定小数位
        dOringal = getDoubleToPattern(dOringal, iScale);
        return dOringal;
    }
    
    /**
     * 数据统一格式化方法，因为从TOP平台的封装，从数据库中查询出0.36类型的数据，Java中返回是.36 使用该方法统一将数据格式化为0.00格式。
     * 
     * @param number 需格式化的数据
     * @param pattern 模式 两位小数是"0.00" 三位小数是"0.000"
     * @return 返回格式化后字符串形式的数据
     */
    public static String formate(String number, String pattern) {
        String value = "";
        if (StringUtils.isEmpty(number) || StringUtils.isEmpty(pattern)) {
            value = "";
        } else {
            // 返回一个新的 double 值，该值被初始化为用指定 String 表示的值，这与 Double 类的 valueOf 方法一样。
            double temp = Double.parseDouble(number);
            // 创建一个DecimalFormat实例
            DecimalFormat df = (DecimalFormat) NumberFormat.getInstance();
            // 将给定的模式应用于此 Format 对象
            df.applyPattern(pattern);
            value = df.format(temp);
        }
        return value;
    }
    
    /**
     * 获得两个时间的时间差，天为单位
     * 
     * @param beginTime 开始时间字符
     * @param endTime 结束时间字符
     * @param format 格式
     * @return 时间差
     */
    public static Long getStringTimeDiff(String beginTime, String endTime, String format, char interval) {
        long division = 0;
        switch (interval) {
            // 秒
            case 's':
                division = 1000;
                break;
            // 分
            case 'n':
                division = 60 * 1000;
                break;
            // 时
            case 'h':
                division = 60 * 60 * 1000;
                break;
            // 天
            case 'd':
                division = 24 * 60 * 60 * 1000;
                break;
            // 周
            case 'w':
                division = 7 * 24 * 60 * 60 * 1000;
                break;
        }
        
        SimpleDateFormat objSimpleDate = new SimpleDateFormat(format);
        Long diff = null;
        if (division != 0) {
            try {
                diff = (objSimpleDate.parse(endTime).getTime() - objSimpleDate.parse(beginTime).getTime()) / division;
            } catch (ParseException e) {
                LOGGER.error("字符串转时间异" + e);
            }
        }
        return diff;
    }
    
    
    
    /**
     * 将javaBean转换成Map
     *
     * @param javaBean javaBean
     * @return Map对象
     */
    public static Map<String, String> toMap(Object javaBean) {
        if (javaBean == null) {
            return new HashMap<String, String>();
        }
        Map<String, String> result = new HashMap<String, String>();
        Method[] methods = javaBean.getClass().getDeclaredMethods();

        for (Method method : methods) {
            try {
                if (method.getName().startsWith("get")) {
                    String field = method.getName();
                    field = field.substring(field.indexOf("get") + 3);
                    field = field.toLowerCase().charAt(0) + field.substring(1);
                    Object value = method.invoke(javaBean, (Object[]) null);
                    result.put(field, null == value ? "" : value.toString());
                }
            } catch (Exception e) {
            }
        }
        return result;
    }

    /**
     * 将List<javaBean>转换成Map
     *
     * @param lstObj
     * @return
     */
    public static List<Map<String, String>> listToMapList(List<Object> lstObj) {
        List<Map<String, String>> lstMap = new ArrayList<Map<String, String>>();
        if (lstObj == null) {
            return lstMap;
        }
        for (int i = 0, iSize = lstObj.size(); i < iSize; i++) {
            lstMap.add(toMap(lstObj.get(i)));
        }
        return lstMap;
    }
    
}